<?php

/**
 * Ведомости
 * Выдает, пользуясь конфигурационным файлом, список предметов, 
 * по которым стоит запрашиваемая оценка
 */
class journal {
	
	/**
	 * Год обучения
	 */
	const YEAR = '2012';
	
	/**
	 * Школьный класс
	 * @var school_class object
	 */
	private $school_class = NULL;
	
	/**
	 * Заголовок оценки
	 * @var string
	 */
	private $grade_itemname = NULL;
	
	/**
	 * Код курса, не NULL, если требуется определённый предмет или предметы
	 * @var string
	 */
	private $course_code = NULL;
	
	/**
	 * Конфигурация ведомости
	 * @var array
	 */
	private $journal_config = NULL;
	
	/**
	 * Данные о названиях курсов
	 * @var courses
	 */
	private $courses_data = NULL;
	
	/**
	 * Курсы
	 * @var array
	 */
	private $courses = array();
	
	function __construct($school_class, $grade_itemname, $course_code = NULL) {
		$this->init_courses_data($school_class);
		$this->set_school_class($school_class);
		$this->set_grade_itemname($grade_itemname);
		$this->set_course_code($course_code);
		$this->init_journal_config();
		$this->init_courses();
	}
	
	function __destruct() {
		
	}
	
	function init_courses_data($school_class) {
		global $CFG;
		include_once($CFG->app_dir . '/course/class.class_courses.php');
		$this->courses_data = new class_courses($school_class);
	}
	
	function set_school_class($school_class) {
		if ($school_class instanceof school_class) {
			$this->school_class = $school_class;
		} else {
			throw new Exception("\$school_class invalid instance of school_class class");
		}
	}
	
	function set_grade_itemname($grade_itemname) {
		$this->grade_itemname = $grade_itemname;
	}
	
	function set_course_code($course_code) {
		if (isset($course_code)) {
			$this->course_code = explode(',', $course_code);
		}
	}
	
	function init_journal_config() {
		global $CFG;
		$this->journal_config = include($CFG->app_dir . '/config/journal/main_config.php');
	}
	
	/**
	 * Инициализация курсов
	 */
	function init_courses() {
		if (isset($this->course_code)) { // если требуется определённый предмет или предметы
			$this->init_by_course_code();
			$this->courses = array_values(
				array_intersect(
					$this->courses, 
					$this->journal_config[$this->school_class->get_specialization()][$this->school_class->get_stream()][$this->grade_itemname]
				)
			);
		} else {
			$this->courses = $this->journal_config[$this->school_class->get_specialization()][$this->school_class->get_stream()][$this->grade_itemname];
		}
		
		// фильтр курсов для секретарей кафедр
		global $authentication;
		if ($authentication->have_access(ACCESS_GROUP_SECRETARY_OF_THE_DEPARTMENT)) { 
			global $CFG;
			include_once($CFG->app_dir . '/department/class.departments.php');
			$user_data = $authentication->get_user_data();
			$departments = new departments($user_data['departments']);
			$this->courses = array_values(array_intersect($this->courses, $departments->get_courses()));
		}
		
		$this->update_to_class();
		$this->update_courses_to_year();
	}
	
	/**
	 * Инициализация курсов по коду
	 */
	private function init_by_course_code() {
		$conformity = $this->courses_data->get_courses_codes();
		foreach ($conformity as $code => $course) {
			if (array_search($code, $this->course_code) === false) {
				unset($conformity[$code]);
			}
		}
		$courses = array();
		foreach ($conformity as $course) {
			$courses[] = $course;
		}
		$this->courses = $courses;
	}
	
	/**
	 * Адаптация названия 
	 */
	function update_to_class() {
		if ($this->school_class->get_stream() == 'a') {
			$class = '10';
		} else {
			$class = '11';
		}
		
		for ($i = 0; $i < count($this->courses); $i++) {
			$this->courses[$i] .= " $class";
		}
	}
	
	/**
	 * Адаптация названия курса к текущему году
	 */
	private function update_courses_to_year() {
		for ($i = 0; $i < count($this->courses); $i++) {
			$this->courses[$i] .= ' (' . journal::YEAR . ')';
		}
	}
	
	/**
	 * Возвращает названия курсов
	 */
	function get_courses() {
		return $this->courses;
	}
	
	/**
	 * Возвращает названия курсов, очищенные от служебной информации по потоку и году
	 */
	private function get_clean_courses($dirty_courses) {
		$courses = array();
		foreach ($dirty_courses as $course) {
			$courses[] = preg_replace("/\s(10|11)\s\([\d]{4}\)/", '', $course);
		}
		return $courses;
	}
	
	/**
	 * Возвращает инициалы предметов
	 */
	function get_initials() {
		return $this->courses_data->get_initials($this->get_clean_courses($this->courses));
	}
}

?>
